Shell script: *, [], {}, ????, como utilizá-los?

Neste artigo abordarei o uso básico dos wildcards (coringas), que combinados com os comandos de terminal podem fazer mágica. Seu domínio é essencial para todo bom administrador de sistemas Linux.

[ Hits: 31.678 ]

Por: Fabio Maran em 30/01/2009 | Blog: http://movimentolivre.zip.net


Utilizando os wildcards - modo listagem



Como em um artigo anterior, tentarei realizar uma interação com o leitor afim de tornar mais fácil o entendimento e aprendizado do assunto. Então vamos meter a mão na massa e abusar de seu uso. Tudo com a maior segurança. :)

Tudo ocorrerá na maioria das vezes no diretório /tmp, pois tudo é apagado assim que se rebota o sistema.

Nesta primeira parte, tratarei apenas da listagem, ou seja, explorar o que se tem em um diretório, e na segunda parte teremos um interação com os comandos cp e mv.

Vamos lá, navegue até o /tmp:

# cd /tmp

Dentro deste diretório criaremos quinze arquivos iniciados com "teste" e contendo números em seu final, vamos lá?

Criei os arquivos, pode seguir este exemplo em uma primeira vez apenas para entender seu uso, depois pode criar seus próprios testes, isso ajuda e muito no entendimento:

# touch teste{1,2,3,4,5,6,7,8,9,10,20,25,30,40,45}

Agora crie um arquivo chamado "otesteo":

# touch otesteo

Arquivos criados!

Vamos ver como ficou o cenário, e para já começar, listaremos apenas os arquivos que nos interessam, que consequentemente são os que acabamos de criar, para isso usaremos o (*):

# ls *test*
otesteo  teste10  teste20  teste3   teste4   teste45  teste6  teste8
teste1   teste2   teste25  teste30  teste40  teste5   teste7  teste9

Bom, mas qual é a finalidade destes arquivos?

Para que possamos entender o uso dos wildcards, precisaremos realizar testes, ou seja, entender como é feito, então trabalharemos em cima destes arquivos, movimentando-os para lá e para cá, removendo, realizando cópias, listagens, enfim, praticando.

Sem muitas delongas, vamos à pratica!

Primeiro listaremos os arquivos que contenham apenas um número no final de seu nome, usaremos o []:

# ls teste[1-9]
teste1  teste2  teste3  teste4  teste5  teste6  teste7  teste8  teste9

Perfeito, tente agora listar arquivos com dois números no final de seu nome, veja, para que consiga realizar tal listagem precisaremos repetir o uso dos [] na expressão. Mas porque? Para cada casa usamos um par de colchetes [], e assim sucessivamente. Se quisermos listar, por exemplo, arquivos que contenham o ano de criação, precisaremos usar 4 pares de colchetes, um para cada casa, vamos lá então:

# ls teste[1-9][0]
teste10  teste20  teste30  teste40

Percebem a diferença entre os dois?

# ls teste[1-9][0-5]
teste10  teste20  teste25  teste30  teste40  teste45

Já que com arquivos sem extensão já estamos nos saindo bem, que tal esquentarmos um pouco as coisas?

Bom, até aqui já conseguimos fazer listagens básicas certo? Mas e se fossem por suas extensões, se elas tivessem alguns outros caracteres, enfim, vamos ver estes cenários:

Lá em /tmp, onde tínhamos os arquivos:

otesteo  teste10  teste20  teste3   teste4   teste45  teste6  teste8
teste1   teste2   teste25  teste30  teste40  teste5   teste7  teste9

Algo bem básico, vamos criar arquivos chamados teste.txt teste.conf e 123teste.txt 123teste.conf.

# touch 123teste{.txt,.conf} teste{.txt,.conf}

Opa, aqui já outra coisa que podemos reparar, podemos criar arquivos de várias extensões diferentes sem precisar repetir o comando, então já podemos perceber também que poderemos listá-los sem problema, vamos lá.

Dentre todos aqueles nosso arquivos em /tmp, eu quero listar os seguintes: otesteo, 123teste.txt, 123teste.conf, teste.txt e teste.conf. Vamos ver como fica?

# ls *teste{o,.txt,.conf}
123teste.conf  123teste.txt  otesteo  teste.conf  teste.txt

Opa, perfeito, mas talvez alguém possa estar perdido neste ponto {o,.txt,.conf}. Certo, vejam em nossa busca, tínhamos uma única certeza inicial, todos os arquivos continham teste, então este é o nosso ponto de partida.

Analisando percebi que os arquivos de que necessitava continham números antes do teste e outros arquivos algumas extensões, assim ficaria mais simples, porém um de nossos arquivos continha uma letra antes e depois.

Então o *teste eliminou qualquer caractere antes deste, porém se tivéssemos usado *teste*{.txt,.conf}, não conseguiríamos suprir nossa busca, pois o * colocaria em nosso resultado qualquer caractere, então acabaríamos com um monte de arquivos.

O que fizemos para eliminar o problema, colocamos o {o,.txt,.conf} que só poderia me retornar qualquer arquivo que contivesse teste no meio e terminasse com uma letra o, como foi o nosso caso.

Claro este foi um exemplo simples, mas entender isso será fundamental, digo isso pois agora iniciaremos uma parte onde o cuidado e a certeza são as chaves para uma boa busca. xD

Espero que tenham entendido o que aqui quis passar, agora apresentarei a vocês a interação dos wildcards com outros comandos, vamos lá?

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. *, [], {}, ????
   3. Utilizando os wildcards - modo listagem
   4. Utilizando os Wildcards - realizando movimentações
Outros artigos deste autor

Samba: Integração com ClamAV e outras coisas úteis

Instalando uma Nvidia no Debian

Virtualização de sistemas

Desktop Debian/Ubuntu

Samba: Servidor de impressão e introdução a PDC (Primary Domain Controller)

Leitura recomendada

Arch Linux em modo UEFI com GNOME

Problemas "bobos" que tive com Sabayon e como resolvê-los

Permissões e propriedades de arquivos

Crie Seu Próprio Gerenciador de Pacotes do Zero - Parte 1

Instalando Fedora CoreOS no KVM

  
Comentários
[1] Comentário enviado por alfameck em 30/01/2009 - 14:59h

ferramenta interessante.

[2] Comentário enviado por Tulio Hoffimann em 30/01/2009 - 15:10h

acrescentando, os metacaracteres "{}" podem ser usados juntamente com o operador ".." que serve para expandir uma sequencia, por exemplo:

No exemplo em que você ultilizou
$ touch aula{1,2,3,4,5,6,7,8,9,10}

Poderia ser facilmente substituido por
$ touch aula{1..10}

E o mesmo pode ser feito com caracteres não-numéricos..
$ echo {a..z}

[3] Comentário enviado por fulllinux em 30/01/2009 - 15:52h

Taí, maran e mais uma de suas super produções!!! hauauha
Abraço meu brother!!!

[4] Comentário enviado por maran em 30/01/2009 - 15:55h

@fulllinux:
kkkkk que isso meu velho, obrigado pelo coment, abraço meu velho, fica na paz!

[5] Comentário enviado por maran em 30/01/2009 - 16:17h

@tuliohm , Fala meu velho, sim podemos fazer estas e outras coisas algo como:

Criar diretorios mais rapidamente, um exemplo simples, bem básico:

$ mkdir /home/maran/{mp3,fotos,musicas,arquivos}

O que aconteceria, seria criado, todos estes diretorios dentro do {}, sendo subdiretórios de /maran

Ou tambem já povoar um arquivo com inumeras linhas, sendo prático para arquivos de exemplos, ou que você repita muitas vezes algumas palavras como:

$ echo -e "\nTeste "{1..20} > wildcards.txt

Eu criaria 20 linhas contendo desde Teste 1 até Teste 20 , cada um em uma linha.

Porem como digo no inicio do artigo, falarei sobre o básico!
Pois como o artigo indica-se a quem esta começando, acabaria confundindo o pessoal!

Obrigado pela observação!

[6] Comentário enviado por cassimirinho em 30/01/2009 - 16:27h

Gostei de ver, está em meus favoritos úteis.

[7] Comentário enviado por leandrojf em 30/01/2009 - 21:24h

boa maram...falo que ia mandar mais um artigo e mandou mesmo...parabens!!!

[8] Comentário enviado por Teixeira em 30/01/2009 - 22:58h

Grande Maran!
Os wildcards ja eram muito importantes nos tempos do DOS,
e nao perderam nada dese aimportancia ate hoje.
Voce abordou com muita felicidade o assunto.
Acho que ficou bem pratico e compreensivel,
pois eeees materia em manuais por ai sempre foi de uma chatice tremenda, que voce conseguiu evitar.
Ficou bem leve.
Parabens!

[9] Comentário enviado por Teixeira em 30/01/2009 - 22:59h

Grande Maran!
Os wildcards ja eram muito importantes nos tempos do DOS,
e nao perderam nada dessa importancia ate hoje.
Voce abordou com muita felicidade o assunto.
Acho que ficou bem pratico e compreensivel,
pois eeees materia em manuais por ai sempre foi de uma chatice tremenda, que voce conseguiu evitar.
Ficou bem leve.
Parabens!

[10] Comentário enviado por Teixeira em 30/01/2009 - 23:01h

Grande Maran!
Os wildcards ja eram muito importantes nos tempos do DOS,
e nao perderam nada dessa importancia ate hoje.
Voce abordou com muita felicidade o assunto.
Acho que ficou bem pratico e compreensivel,
pois essa materia em manuais por ai sempre foi de uma chatice tremenda, que voce conseguiu evitar.
Ficou bem leve.
Parabens!

[11] Comentário enviado por joao_15 em 01/02/2009 - 13:41h

Muito bom o artigo, foi esclarecedor.
Não sabia por exemplo que dava para se usar o {} para criar vários diretórios que estivessem lá dentro.

Vlw por contribuir e mostrar que os wildcards estão aí para nos ajudar.

[12] Comentário enviado por slackmen em 07/02/2009 - 12:47h

Bom artigo, isso eh uma coisa que muita gente esquece e esquenta a cabeça com coisas simples enquanto poderia usar os coringas...

[13] Comentário enviado por Weverton em 24/02/2009 - 10:55h

Artigo bacana, essas dicas sempre facilitam a vida de nós administradores.

[14] Comentário enviado por leandrojpg em 20/02/2010 - 22:15h

Boa Maran, excelente post eu por exemplo aprendi tudo depois que li seu post.

valeu mesmo, fica na paz irmão. valeu


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts